<?php
class Indicator extends MY_Controller {
	// Modelos usados en las funciones del controlador
	var $modelIndicatorDAO = 'Indicator_dao';
	var $modelIndicatorDTO = 'Indicator_dto';

	var $modelRoundInputDAO = 'Round_input_dao';
	var $modelRoundDAO = 'Round_dao';

	var $modelOutputDAO = 'Output_dao';
	var $modelOutputDTO = 'Output_dto';
	
	var $modelUserDAO = 'User_dao';
	var $modelUserDTO = 'User_dto';
	
	// Vistas utilizadas en las funciones del controlador
	var $editionView = 'indicator/indicator_new_view';
	var $gridView = 'indicator/indicator_all_view';
	var $resultMessageView = '';	
	
	// Vista a la que debe redirigirse al guardar/borrar un indicador
	var $redirectMethod = 'information/getAll';
	
	// Datos para pasar a las vistas
	var $pageTitle = '';
	
	private $controllerName = 'indicator';
	
	public function __construct()
    {
    	parent::__construct();
		
		// Éstos modelos los cargo al inicio ya que los utilizo en la mayoría de los métodos
		$this->load->model("$this->modelIndicatorDAO", 'Indicator_dao');
		$this->load->model("$this->modelIndicatorDTO", 'Indicator_dto');
		
		$this->resultMessageView = $this->template->getResultMessageView();
	}
	
	private function _loadOutputModels()
	{
		$this->load->model("$this->modelOutputDAO", 'Output_dao');
		$this->load->model("$this->modelOutputDTO", 'Output_dto');
	}
	
	private function _loadUserModels()
	{
		$this->load->model("$this->modelUserDAO", 'User_dao');
		$this->load->model("$this->modelUserDTO", 'User_dto');
	}
	
	public function addIndicator($idOutput = 0)
	{
		$this->pageTitle = 'New Indicator';
		$this->_loadEditionForm(0, $idOutput, 'addIndicator');
	}
	
	public function editIndicator($idIndicator, $idOutput)
	{
		$this->pageTitle = 'Edit Indicator';
		$this->_loadEditionForm($idIndicator, $idOutput, 'editIndicator');
	}
	
	private function _loadEditionForm($idIndicator = 0, $idOutput = 0, $function, $cargar_completo = FALSE, $isModal = TRUE)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, $function)) {
			// Cargo las librerías y modelos que voy a utilizar
			$this->_loadOutputModels();
			$this->_loadUserModels();
			
			// Estas variables se utilizan en la vista para cargar la información acorde. Establezco valores por defecto
			$dataView['idOutput'] = $idOutput;
			$dataView['idOutcome'] = 0;
			$dataView['idBusinessLine'] = 0;
			
			// Para la carga de los indicadores, debo obtener las salidas a los que puede asociarse
			if($idOutput != 0) {
				$outp = $this->Output_dao->obtenerObjetoPorID($idOutput);
				$dataView['idOutcome'] = $outp->idOutcome;
				$dataView['idBusinessLine'] = $outp->getObjOutcome()->idBusinessLine;
				$outputs = array($outp);
			}
			else $outputs = $this->Output_dao->obtenerDatos();
			$dataView['outputs'] = $outputs;
			
			// Para la carga de los indicadores, debo poder definir un usuario que sea el Owner del indicador
			$users = $this->User_dao->obtenerDatos();
			$dataView['users'] = $users;
			
			// Obtengo el indicador que se desea modificar y mostrar en la vista
			$dataView['indicator'] = $this->Indicator_dao->obtenerObjetoPorID($idIndicator);
			$dataView['isModal'] = $isModal;

			if(!$cargar_completo) $this->load->view($this->editionView, $dataView);
			else parent::_loadViews($this->editionView, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function saveIndicator($idBusinessLine = 0, $idOutcome = 0, $idOutput = 0)
	{	
		$this->pageTitle = 'Save Indicator';
	
		// Se agregan las validaciones a los campos que corresponde
		$this->form_validation->set_rules('nameInd','Indicator Name','trim|required|max_length[250]|xss_clean');
		$this->form_validation->set_rules('output_ind','Output','trim|required');
		
		$id = is_numeric($this->input->post('idInd')) ? $this->input->post('idInd') : 0;
        if ($this->form_validation->run() == FALSE)
        {
			// Alguno de los campos no pasó la validación anterior, vuelvo a mostrar el fomulario de edición	
			$this->_loadEditionForm($id, $idOutput, 'addIndicator', TRUE, FALSE);
        }else{ // La validación del formulario fue exitosa, puedo continuar y guardar los datos
			
    		if($this->nombreDisponible($this->input->post('nameInd'), $this->input->post('output_ind'))) {
				// Obtengo los datos desde el formulario y los asigno al modelo
				if($id == 0) {
					$indicator = new Indicator_dto();
					$indicator->id = 0;
				}
				else $indicator = $this->Indicator_dao->obtenerObjetoPorID($id);
				
				$indicator->name = $this->input->post('nameInd');
				$indicator->idOutput = $this->input->post('output_ind');
				$indicator->idOwner = 0; //$this->input->post('owner');

				$result = $this->Indicator_dao->guardar($indicator);
				
				// Valido si ocurrió algún error al intentar guardar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') { // Si no hubo error y se guardó la nueva línea, continúo
					redirect($this->redirectMethod . '/' . $idBusinessLine . '/' . $idOutcome . '/' . $idOutput);
				}
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$this->form_validation->set_message('nameInd', 'This Indicator name already exists');			
				$this->_loadEditionForm($id, $idOutput, 'addIndicator', TRUE, FALSE);
			}
        }
	}
	
	public function deleteIndicator($idIndicator, $idBusinessLine = 0, $idOutcome = 0, $idOutput = 0)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, 'deleteIndicator')) {
			$this->pageTitle = 'Delete Indicator';
			
			if($this->validarEliminacion($idIndicator)) {
				$result = $this->Indicator_dao->borrar($idIndicator);
					
				// Valido si ocurrió algún error al intentar borrar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') redirect($this->redirectMethod . '/' . $idBusinessLine . '/' . $idOutcome . '/' . $idOutput);
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$dataView['result'] = 'Can not delete an Indicator with associated round inputs.';
				parent::_loadViews("$this->resultMessageView", $dataView);
			}
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function setOwner($idIndicator, $idUser, $idBusinessLine = 0, $idOutcome = 0, $idOutput = 0)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, 'setOwner')) {
			if($idIndicator != 0 && $idUser != 0) { 
				$result = $this->Indicator_dao->setOwner($idIndicator, $idUser);
					
				// Valido si ocurrió algún error al intentar borrar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') redirect($this->redirectMethod . '/' . $idBusinessLine . '/' . $idOutcome . '/' . $idOutput . '/' . $idIndicator);
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
					$dataView['result'] = 'Must select a user';
					parent::_loadViews("$this->resultMessageView", $dataView); 
				}
		}
		else { 
			parent::loadForbiddenView();
		}
	}

	public function permittedDelete()
	{
		$idInd = $this->input->post('item');
		
		if(!$idInd) echo FALSE;
        else {
			if($this->validarEliminacion($idInd)) echo TRUE;
        	else echo FALSE;
        }
	}


	private function validarEliminacion($idInd)
	{
		$this->load->model($this->modelRoundInputDAO);

    	// Compruebo si el indicador tiene entradas a rondas asociadas
		$condiciones = array('idIndicator' => $idInd);
		$consulta = $this->Round_input_dao->obtenerObjetos($condiciones);
		if (sizeof($consulta) == 0) {
			 return TRUE;
		}
		else return FALSE;
	}

	// La validación del nombre se hace a nivel de padre. Es decir que no puede haber dos indicadores con el mismo
	// nombre siempre y cuando pertenezcan al mismo Output
	public function existName()
	{
		$name = $this->input->post('item');
		$idParent = $this->input->post('idParent');
		
		if(!$name) echo FALSE;
        else {
        	if(!$this->nombreDisponible($name, $idParent)) echo TRUE;
			else echo FALSE;
        }
	}

	public function nombreDisponible($name, $idParent)
	{
		$name = trim($name);
		$condiciones = array('name' => "$name",
							 'idOutput' => $idParent);
		
		$consulta = $this->Indicator_dao->obtenerDatos($condiciones);
		if (sizeof($consulta) > 0) {
			 return FALSE; // El nombre no es válido porque ya hay otro con ese nombre
		}
		else return TRUE;
	}
}